#include "launch/param_parser.h"
#include "logger.h"
#include "utils/utils.h"
#include "utils/xmlrpc_helper.h"
#include "utils/common_utils.h"
#include <utils/string_util.h>

ParamParser::ParamParser(const std::string &ns)
    : paramNameSpace(ns)
{}
ParamParser::~ParamParser() = default;

bool ParamParser::parser(const tinyxml2::XMLElement *element)
{
    const char *nameAttribute;
    //name
    tinyxml2::XMLError xmlError = element->QueryAttribute("name", &nameAttribute);
    if (tinyxml2::XMLError::XML_SUCCESS != xmlError)
    {
        ROS_ERROR("namespace: %s, param get name fail, %s", Utils::formatElement(element).c_str());
        return false;
    }
    //value
    const char *valueAttribute;
    xmlError = element->QueryAttribute("value", &valueAttribute);
    if (tinyxml2::XMLError::XML_SUCCESS != xmlError)
    {
        ROS_ERROR("namespace: %s, param get value fail, %s", Utils::formatElement(element).c_str());
        return false;
    }
    //这里存入参数服务器
    std::string namespaceName = utils::StringUtil::format("/%s/%s", paramNameSpace.c_str(), nameAttribute);
    namespaceName = CommonUtils::removeBias(namespaceName);
    if (!pXmlrpcHelper->saveParameterToServer(namespaceName, valueAttribute))
    {
        ROS_ERROR("save %s:%s to parameter server fail", namespaceName.c_str(), valueAttribute);
        return false;
    }
    ROS_INFO("save parameter into param server, %s:%s", namespaceName.c_str(), valueAttribute);
    return true;
}
